package info.liuxing.config;

import info.liuxing.aop.LogAspects;
import info.liuxing.aop.MathCalculator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

/**
 * AOP：【动态代理】
 * <p>
 * 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式
 * 1、导入aop模块；Spring AOP: (spring-aspects)
 * 2、定义一个业务逻辑类(MathCalculator)；在业务逻辑运行的时候将日志进行打印
 * 3、定义一个日志切面类(LogAspects)，切面类中的方法需要动态感知到MathCalculator.division的运行步骤，然后执行
 * 通知方法：
 * 前置通知(@Before)：在目标方法运行之前执行
 * 后置通知(@After)：在目标方法运行之后执行（正常和异常结束都会执行）
 * 返回通知(@AfterReturning)：在目标方法正常运行结束之后执行
 * 异常通知(@AfterThrowing)：在目标方法出现异常后执行
 * 环绕通知(@Around)：动态代理，手动推进目标方法运行（joinPoint.procced()）
 * <p>
 * 4、给切面类的目标方法标注如何运行（通知注解）
 * 5、将切面类和业务逻辑类（目标方法所在类）都加入到IOC容器中
 * 6、必须告诉Spring哪个类是切面类（给切面类加注解@Aspect）
 * 7、给配置类加@EnableAspectJAutoProxy，开启基于注解的AOP模式
 *
 * 三步：
 * 1、将业务逻辑组件和切面类都加入到容器中，告诉Spring哪个是切面类（@Aspect）；
 * 2、在切面类上的每一个通知方法上标注通知注解，告诉Spring何时何地运行（切入点表达式）；
 * 3、开启基于注解的AOP模式，@EnableAspectJAutoProxy；
 *
 * @author liuxing
 * @summary MainConfigOfAOP
 * @Copyright (c) 2018, Lianjia Group All Rights Reserved.
 * @since 2018-05-01 19:20
 */
@EnableAspectJAutoProxy
@Configuration
public class MainConfigOfAOP {

    /**
     * 业务逻辑类加入到容器中
     *
     * @return
     */
    @Bean
    public MathCalculator mathCalculator() {
        return new MathCalculator();
    }

    /**
     * 切面类加入到容器中
     *
     * @return
     */
    @Bean
    public LogAspects logAspects() {
        return new LogAspects();
    }

}

